/*
 * @Author: 李志刚
 * @CopyRight: 2020-2030 衡水山木枝技术服务有限公司
 * @Date: 2021-11-22 09:26:29
 * @Description: socket 服务端测试一下
 * @LastEditors: 李志刚
 * @LastEditTime: 2021-11-22 11:53:39
 * @FilePath: /CLang/socket/socket-s.c
 */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>

#define PORT 1500 //端口号
#define BACKLOG 5 /*最大监听数*/
#define MAX_DATA 100 //接收到的数据最大程度

int main()
{
    int sockfd, new_fd;            /*socket句柄和建立连接后的句柄*/
    struct sockaddr_in my_addr;    /*本方地址信息结构体，下面有具体的属性赋值*/
    struct sockaddr_in their_addr; /*对方地址信息*/
    socklen_t sin_size;

    sockfd = socket(AF_INET, SOCK_STREAM, 0); //建立socket
    if (sockfd == -1)
    {
        printf("socket failed:%d", errno);
        return -1;
    }
    my_addr.sin_family = AF_INET;                /*该属性表示接收本机或其他机器传输*/
    my_addr.sin_port = htons(PORT);              /*端口号*/
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /*IP，括号内容表示本机IP*/
    bzero(&(my_addr.sin_zero), 8);               /*将其他属性置0*/
    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) < 0)
    { //绑定地址结构体和socket
        printf("bind error:%d \n", errno);
        return -1;
    }
    listen(sockfd, BACKLOG); //开启监听 ，第二个参数是最大监听数
    while (1)
    {
        sin_size = sizeof(struct sockaddr_in);
        new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size); //在这里阻塞直到接收到消息，参数分别是socket句柄，接收到的地址信息以及大小
        if (new_fd == -1)
        {
            printf("receive failed");
        }
        else
        {
            char buf[MAX_DATA]; //储存接收数据
            recv(new_fd, buf, MAX_DATA,0);
            strcat(buf," Hello");
            // 判断是否发送完成
            if (strstr(buf,"aaa"))
            {
                send(new_fd, buf, sizeof(buf), 0); //发送内容，参数分别是连接句柄，内容，大小，其他信息（设为0即可）
                close(new_fd);
                memset(buf, 0, MAX_DATA); //重置缓冲区
                printf("Closed fd %d!\n", new_fd);
            }
            else{
                printf("Received:%s\n", buf);
            }
        }
    }
    close(sockfd);
    return 0;
}